#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) (x & -x)
const int MAX_N = 2e6 + 5, MAX_Q = 2e5 + 5;
int n, m;
// 树状数组相关
int bit
    [MAX_N]; // 树状数组，用于维护线段数量的前缀和，辅助进行快速的区间查询与更新操作。
int res[MAX_Q];                       // 查询左右端点和结果
vector<int> segL[MAX_N], segR[MAX_N]; // 线段左右端点
// 修改查询索引部分
vector<pair<int, int>> queries(MAX_Q);            // 存储所有查询
vector<vector<int>> qryAtL(MAX_N), qryAtR(MAX_N); // 按端点分组的查询索引
// qryAtL[MAX_N]` 和 `qryAtR[MAX_N]`**：向量数组。`qryAtL[i]` 存储左端点为 `i`
// 的所有查询的编号；`qryAtR[i]` 存储右端点为 `i` 的所有查询的编号。

int query(int pos) {
  int sum = 0;
  while (pos > 0) {
    sum += bit[pos];
    pos -= lowbit(pos);
  }
  return sum;
}

void update(int pos, int val) {
  while (pos <= n) {
    bit[pos] += val;
    pos += lowbit(pos);
  }
}

int main() {

  cin >> n >> m;
  n *= 2; // 圆展开为线性

  // 读取线段
  for (int i = 0; i < m; i++) {
    int a, b;
    cin >> a >> b;
    // segL[i] 存储以 i 为左端点的所有线段的右端点；
    // segR[i] 存储以 i为右端点的所有线段的左端点。
    segL[a].push_back(b);
    segR[b].push_back(a);
  }

  // 读取查询
  int q;
  cin >> q;
  for (int i = 0; i < q; i++) {
    cin >> queries[i].first >> queries[i].second;
    // qryAtL[MAX_N] 和 qryAtR[MAX_N]：向量数组。
    // qryAtL[i] 存储左端点为 i 的所有查询的编号；
    // qryAtR[i] 存储右端点为 i 的所有查询的编号。
    qryAtL[queries[i].first].push_back(i);  // 按左端点分组,左端点有哪些查询编号
    qryAtR[queries[i].second].push_back(i); // 按右端点分组
  }

  // 正向处理每个右端点
  for (int i = 1; i <= n; i++) {
    for (int left : segR[i]) {
      update(left, 1);
      update(i, -1);
    }
    for (int qid : qryAtR[i]) {
      res[qid] += query(queries[qid].first);
    }
  }

  memset(bit, 0, sizeof(bit));

  // 反向处理 每个左端点
  for (int i = n; i >= 1; i--) {
    for (int right : segL[i]) {
      update(1, 1);
      update(right, -1);
    }
    for (int qid : qryAtL[i]) {
      res[qid] += query(queries[qid].second);
    }
  }

  // 输出结果
  for (int i = 0; i < q; i++) {
    cout << res[i] << '\n';
  }

  return 0;
}